x86: On CPU shutdown, clear pending FPU exceptions.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 4 Mar 2008 10:33:50 +0000 (10:33 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 4 Mar 2008 10:33:50 +0000 (10:33 +0000)
I've seen at least one BIOS which fails warm reboot if FPU exceptions
are pending.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/smp.c

index 11e150e75a724576742718c85bc0e1144421e867..51f0688f7c8cd0f2aeb2af0841de9dc740d4df28 100644 (file)
@@ -306,15 +306,26 @@ int on_selected_cpus(
     return 0;
 }
 
-static void stop_this_cpu (void *dummy)
+static void __stop_this_cpu(void)
 {
     ASSERT(!local_irq_is_enabled());
 
     disable_local_APIC();
+
     hvm_cpu_down();
 
-    cpu_clear(smp_processor_id(), cpu_online_map);
+    /*
+     * Clear FPU, zapping any pending exceptions. Needed for warm reset with
+     * some BIOSes.
+     */
+    clts();
+    asm volatile ( "fninit" );
+}
 
+static void stop_this_cpu(void *dummy)
+{
+    __stop_this_cpu();
+    cpu_clear(smp_processor_id(), cpu_online_map);
     for ( ; ; )
         halt();
 }
@@ -334,9 +345,8 @@ void smp_send_stop(void)
         mdelay(1);
 
     local_irq_disable();
-    disable_local_APIC();
+    __stop_this_cpu();
     disable_IO_APIC();
-    hvm_cpu_down();
     local_irq_enable();
 }